home *** CD-ROM | disk | FTP | other *** search
/ Planet Source Code Jumbo …e CD Visual Basic 1 to 7 / 5_2007-2008.ISO / data / Zips / Small_Data2054393172007.psc / Small DB engine 2 / clsRecordset.cls < prev    next >
Text File  |  2007-02-17  |  26KB  |  748 lines

  1. VERSION 1.0 CLASS
  2. BEGIN
  3.   MultiUse = -1  'True
  4.   Persistable = 0  'NotPersistable
  5.   DataBindingBehavior = 0  'vbNone
  6.   DataSourceBehavior  = 0  'vbNone
  7.   MTSTransactionMode  = 0  'NotAnMTSObject
  8. END
  9. Attribute VB_Name = "clsRecordset"
  10. Attribute VB_GlobalNameSpace = False
  11. Attribute VB_Creatable = True
  12. Attribute VB_PredeclaredId = False
  13. Attribute VB_Exposed = False
  14. '==============================================================
  15. '       class_name           : clsRecordset
  16. '       class_version        : v. 1.0.0
  17. '       app_name and version : Small Database Engine v. 2
  18. '       class_description    : this class search for number
  19. '                              of rows that match query, read
  20. '                              selected row from file
  21. '==============================================================
  22.  
  23. Option Explicit
  24. 'opened file
  25. Private ffDB As Integer
  26. 'last position, position of first data, pos of last data
  27. Private last_pos As Long, first_start As Long, last_start As Long, last_id As Long, id_col As Integer
  28. 'step big, med, small
  29. 'Private stp_big As Long, stp_med As Long, stp_small As Long
  30. 'records count, columns count, current_row
  31. Private record_cnt As Long, column_cnt As Long, curr_row As Long
  32. 'if there is <>
  33. Private skip_row As Long
  34. 'all records in table
  35. Private tbl_recs As Long
  36. 'other data from clsDatabase
  37. Private strSql As String, haveWhere As Boolean
  38. 'selected columns
  39. Private msel_cols() As Integer
  40. 'columns, values and operators in where statment
  41. Private colIndex_arr() As Integer, val_arr() As String, operator_arr() As String, condOper_arr() As String
  42. 'to store row fields
  43. Private fileds_arr() As String
  44. 'indexed columns and char index positions
  45. Private ind_cols() As Integer, chrInd_pos() As Long
  46. 'positions of columns that should not be in recordest
  47. Private dontUse_arr() As Long
  48. 'position of columns that match query if we using muliple condition seach
  49. Private use_arr() As Long, readFrom_arr As Boolean
  50. 'position in file of current record (need if we use recordset for
  51. '       deleting)
  52. Private currRec_pos As Long
  53. Private is_delete As Boolean
  54. '
  55. Private r_data As row_data, prev_row As Long, tmp_row As Long
  56. Private ind_data As srch_indexes, prev_ind As Long, first_ind As Long
  57. '
  58. Private tmp_rowData As String
  59. '
  60. Dim i As Integer, j As Integer, k As Integer, c As Integer, lastS As Integer
  61. Dim i1 As Integer
  62.  
  63.  
  64. '##############################################################
  65. '                  friend properties
  66. '##############################################################
  67. 'opened db file number
  68. Friend Property Let db_FileNumber(ByVal nV As Integer)
  69.     ffDB = nV
  70. End Property
  71. 'last position in file
  72. Friend Property Let db_LastPosition(ByVal nV As Long)
  73.     last_pos = nV
  74.     prev_row = nV
  75. End Property
  76. 'last id
  77. Friend Property Let db_LastID(ByVal nV As Long)
  78.     last_id = nV
  79. End Property
  80. 'id column index
  81. Friend Property Let db_idCol(ByVal nV As Integer)
  82.     id_col = nV
  83. End Property
  84. '~~~~~~~~~~~~~ steps ~~~~~~~~~~~~~~~~~~~~~~~
  85. 'Friend Property Let db_StepBig(ByVal nV As Long)
  86. '    stp_big = nV
  87. 'End Property
  88. 'Friend Property Let db_StepMed(ByVal nV As Long)
  89. '    stp_med = nV
  90. 'End Property
  91. 'Friend Property Let db_StepSmall(ByVal nV As Long)
  92. '    stp_small = nV
  93. 'End Property
  94. '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  95.  
  96. 'allRecordsCount
  97. Friend Property Let tbl_records(ByVal nV As Long)
  98.     tbl_recs = nV
  99. End Property
  100. 'sql query
  101. Friend Property Let str_sql(ByVal nV As String)
  102.     strSql = nV
  103. End Property
  104. 'is there what statment in query
  105. Friend Property Let have_where(ByVal nV As Boolean)
  106.     haveWhere = nV
  107. End Property
  108. '
  109. '
  110. 'is there what statment in query
  111. Friend Property Let isForDelete(ByVal nV As Boolean)
  112.     is_delete = nV
  113. End Property
  114. 'if we need record position to delete it
  115. Friend Property Get RecordPosition() As Long
  116.     RecordPosition = currRec_pos
  117. End Property
  118. '##############################################################
  119. '                  friend subs/functions
  120. '##############################################################
  121. Friend Sub set_arrs(ByRef sel_cols() As Integer, ByRef col_ind() As Integer, _
  122.         ByRef cnd_vals() As String, ByRef cnd_oper() As String, ByRef oper2() As String, _
  123.         indexedCols_arr() As Integer, charIndexes_pos() As Long)
  124.     '
  125.     msel_cols = sel_cols
  126.     colIndex_arr() = col_ind
  127.     val_arr() = cnd_vals
  128.     operator_arr() = cnd_oper
  129.     condOper_arr() = oper2
  130.     'redim array that store row fields
  131.     ReDim fileds_arr(UBound(msel_cols))
  132.     column_cnt = UBound(msel_cols) + 1
  133.     ind_cols = indexedCols_arr
  134.     chrInd_pos = charIndexes_pos
  135. End Sub
  136.  
  137. '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  138. '               search for results count
  139. '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  140. Friend Sub result_count()
  141.     readFrom_arr = False
  142.     prev_ind = -1
  143.     skip_row = 0
  144. '-->
  145.     'if there is no WHERE wuery
  146.     If haveWhere = False Then
  147.         record_cnt = tbl_recs
  148.         first_start = last_pos
  149. '-->
  150.     'if searching by primary key only
  151.     ElseIf UBound(colIndex_arr) = 0 And colIndex_arr(0) = id_col Then
  152.         search_primKey
  153. '-->
  154.     'if search in one column but this isn't primary key column
  155.     ElseIf UBound(colIndex_arr) = 0 And colIndex_arr(0) <> id_col Then
  156.         search_IndexedRow
  157. '-->
  158.     'if searching by primary key only, but 2 conditions
  159.     ElseIf UBound(colIndex_arr) = 1 And colIndex_arr(0) = id_col And colIndex_arr(1) = id_col Then
  160.         Dim rec1 As Long, rec2 As Long
  161.         Dim pos1 As Long, pos2 As Long
  162.         Dim tmp_last1 As Long, tmp_last2 As Long
  163.         'search first condition
  164.         search_primKey 0
  165.         pos1 = first_start
  166.         rec1 = record_cnt
  167.         tmp_last1 = last_start
  168.         'search second condition
  169.         search_primKey 1
  170.         pos2 = first_start
  171.         rec2 = record_cnt
  172.         tmp_last2 = last_start
  173.         '
  174.         'get where starts first and last row in file
  175.         If pos1 < pos2 Then
  176.             first_start = pos1
  177.         Else
  178.             first_start = pos2
  179.         End If
  180.  
  181.         If tmp_last1 > tmp_last2 Then
  182.             last_start = tmp_last1
  183.         Else
  184.             last_start = tmp_last2
  185.         End If
  186.         '
  187.         'get unused records if looking for <
  188.         If Trim(operator_arr(0)) = "<" Then
  189.             rec1 = tbl_recs - rec1
  190.         End If
  191.         If Trim(operator_arr(1)) = "<" Then
  192.             rec2 = tbl_recs - rec2
  193.         End If
  194.         'get record sount
  195.         If Trim(operator_arr(0)) <> Trim(operator_arr(1)) Then
  196.             record_cnt = Abs(rec1 - rec2)
  197.         Else
  198.             If rec1 < rec2 Then
  199.                 record_cnt = rec1
  200.                 first_start = pos1
  201.             Else
  202.                 record_cnt = rec2
  203.                 first_start = pos2
  204.             End If
  205.         End If
  206. '-->
  207.     'if there is any other contition idCol='val' AND/OR col2='val2'...
  208.     Else
  209.         search_muliple 0
  210.         readFrom_arr = True
  211.     End If
  212. End Sub
  213.  
  214. '?????????????????????????????????????????????????????????????????
  215. '               search by muliple condition
  216. '?????????????????????????????????????????????????????????????????
  217. Private Sub search_muliple(Optional arrInd1 As Integer = 0)
  218.     'results positions
  219.     Dim tmp_res() As Long ' (number of columns to check, number of rows that match)
  220.     Dim col_res() As Long ' number of rows for each column
  221.     Dim tmp_res2() As Long, tmp_arr1() As Long
  222.     Dim tmp_cnt As Long
  223.     '
  224.     Dim i As Integer, z As Integer, j As Long, last_val As Long
  225.     Dim tmp_isForDel As Boolean
  226.     '
  227.     ReDim tmp_res(UBound(colIndex_arr), 1000)
  228.     ReDim col_res(UBound(colIndex_arr))
  229.     last_val = 1000
  230.     '
  231.     'set is for delete to True to avoid parsing row fields and
  232.     '   get faster execute
  233.     tmp_isForDel = is_delete
  234.     isForDelete = True
  235.     tmp_cnt = 0
  236.     For i = 0 To UBound(colIndex_arr)
  237.         If colIndex_arr(i) = id_col Then
  238.             search_primKey (i)
  239.             'move to first record that match query
  240.             If record_cnt > 0 Then
  241.                 MoveFirst
  242.                 For j = 0 To record_cnt - 1
  243.                     'if we need to increse array size
  244.                     If j > last_val Then
  245.                         last_val = last_val + 1000
  246.                         ReDim Preserve tmp_res(UBound(colIndex_arr), last_val)
  247.                     End If
  248.                     '
  249.  
  250.                     'save position of record
  251.                     tmp_res(i, j) = RecordPosition
  252.                     'increse number of records that match query for current row
  253.                     col_res(i) = col_res(i) + 1
  254.                     'move to next record
  255.                     MoveNext
  256.                 Next j
  257.             End If
  258.         Else
  259.             search_IndexedRow (i)
  260.             If record_cnt > 0 Then
  261.                 'move to first record that match query
  262.                 MoveFirst
  263.                 For j = 0 To record_cnt - 1
  264.                     'if we need to increse array size
  265.                     If j > last_val Then
  266.                         last_val = last_val + 1000
  267.                         ReDim Preserve tmp_res(UBound(colIndex_arr), last_val)
  268.                     End If
  269.                     'save position of record
  270.  
  271.                     tmp_res(i, j) = RecordPosition
  272.                     'increse number of records that match query for current row
  273.                     col_res(i) = col_res(i) + 1
  274.                     'move to next record
  275.                     MoveNext
  276.                 Next j
  277.             End If
  278.         End If
  279.         tmp_cnt = tmp_cnt + last_val
  280.     Next i
  281.     'restore is for delete
  282.     isForDelete = tmp_isForDel
  283.     '
  284.     ReDim tmp_res2(tmp_cnt)
  285.     tmp_cnt = 0
  286.     'number of AND/OR operators
  287.     For z = 0 To UBound(condOper_arr)
  288.         ReDim tmp_arr1(col_res(z + 1))
  289.         For j = 0 To col_res(z + 1) - 1
  290.             tmp_arr1(j) = tmp_res(z + 1, j)
  291.         Next j
  292.         'whatch column name before operator and after operator ''''number of columns to check
  293.         For i = 0 To 1 'UBound(colIndex_arr)
  294.             'number of results for current column
  295.             For j = 0 To col_res(z + i) - 1
  296.                 'select operator ( AND / OR )
  297.                 Select Case Trim(condOper_arr(z))
  298.                     Case "AND", "and"
  299.                         If isInArrLng(tmp_res2, tmp_res(z, j)) <> True Then
  300.                             If isInArrLng(tmp_arr1, tmp_res(z, j)) = True Then
  301.                                 tmp_res2(tmp_cnt) = tmp_res(z, j)
  302.                                 tmp_cnt = tmp_cnt + 1
  303.                             End If
  304.                         End If
  305.                         If j = col_res(z + i) - 1 Then GoTo exitCh
  306.                     Case "OR", "or"
  307.                         'MsgBox tmp_res(i, j) & vbCrLf & i
  308.                         If isInArrLng(tmp_res2, tmp_res(z + i, j)) <> True Then
  309.                             tmp_res2(tmp_cnt) = tmp_res(z + i, j)
  310.                             tmp_cnt = tmp_cnt + 1
  311.                         End If
  312.                 End Select
  313.             Next j
  314.         Next i
  315. exitCh:
  316.     Next z
  317.     
  318.     record_cnt = tmp_cnt
  319.     
  320.  
  321.     If tmp_cnt > 0 Then
  322.         ReDim use_arr(tmp_cnt - 1)
  323.         For i = 0 To tmp_cnt - 1
  324.             use_arr(i) = tmp_res2(i)
  325.         Next i
  326.     End If
  327.     'free memory
  328.     Erase col_res
  329.     Erase tmp_res
  330.     Erase tmp_res2
  331.     Erase tmp_arr1
  332.     DoEvents
  333. End Sub
  334.  
  335.  
  336. '?????????????????????????????????????????????????????????????????
  337. '               search by indexed row
  338. '?????????????????????????????????????????????????????????????????
  339. Private Sub search_IndexedRow(Optional arrInd1 As Integer = 0)
  340.     Dim i As Integer
  341.     Dim tmp_int As Long
  342.     Dim ret_pos As Long
  343.     '
  344.     Erase dontUse_arr
  345.         '
  346.     tmp_int = -1
  347.     For i = 0 To UBound(ind_cols)
  348.         If ind_cols(i) = colIndex_arr(arrInd1) Then
  349.             tmp_int = colIndex_arr(arrInd1)
  350.         End If
  351.     Next i
  352.     'get position of char indexes
  353.     For i = 0 To UBound(ind_cols)
  354.         If tmp_int = ind_cols(i) Then
  355.             tmp_int = chrInd_pos(i)
  356.             Exit For
  357.         End If
  358.     Next i
  359.     
  360.     If tmp_int < 0 Then Exit Sub
  361.     'get position of first index
  362.     loadIndex ffDB, val_arr(arrInd1), tmp_int, ret_pos
  363.     '
  364.     record_cnt = 0
  365. '-->
  366.     If Trim(operator_arr(arrInd1)) = "=" Then
  367.         'count records
  368.         Do While ret_pos > 0
  369.             Get #ffDB, ret_pos, ind_data
  370.             'if index contain pointer to row that match query
  371.             If ind_data.fld_data = val_arr(arrInd1) Then
  372.                 'read row
  373.                 Get #ffDB, ind_data.fld_row, r_data
  374.                 'check is deleted
  375.                 If r_data.row_using = "+" Then
  376.                     'save position of first record
  377.                     If record_cnt = 0 Then
  378.                         first_start = ind_data.fld_row
  379.                         prev_ind = ret_pos ' ind_data.prev_index
  380.                     End If
  381.                     'save current position as last position and do this
  382.                     '   for each record that match query (because we dont know
  383.                     '   realy what record is last
  384.                     last_start = ret_pos
  385.                     'insrease record count
  386.                     record_cnt = record_cnt + 1
  387.                 End If
  388.             End If
  389.             ret_pos = ind_data.prev_index
  390.         Loop
  391.         
  392. '-->
  393.     ElseIf Trim(operator_arr(arrInd1)) = "<>" Then
  394.          'count records
  395.         Do While ret_pos > 0
  396.             Get #ffDB, ret_pos, ind_data
  397.             'if index contain pointer to row that match query
  398.             If ind_data.fld_data = val_arr(arrInd1) Then
  399.                 'read row
  400.                 Get #ffDB, ind_data.fld_row, r_data
  401.                 'check is deleted
  402.                 If r_data.row_using = "+" Then
  403.                     ReDim Preserve dontUse_arr(record_cnt)
  404.                     dontUse_arr(record_cnt) = ind_data.fld_row
  405.                     record_cnt = record_cnt + 1
  406.                 End If
  407.             End If
  408.             ret_pos = ind_data.prev_index
  409.         Loop
  410.         first_start = last_pos
  411.         prev_ind = -1
  412.         record_cnt = tbl_recs - record_cnt
  413.     End If
  414. End Sub
  415.  
  416.  
  417. '?????????????????????????????????????????????????????????????????
  418. '               search only by primary key
  419. '?????????????????????????????????????????????????????????????????
  420. Private Sub search_primKey(Optional arrInd1 As Integer = 0)
  421.     record_cnt = 0
  422. '-->
  423.     If Trim(operator_arr(arrInd1)) = "=" Then
  424.         prev_row = last_pos
  425.         Do While prev_row > 0
  426.             Get ffDB, prev_row, r_data
  427.             'if we are on step row then move to prevous because it's pointer is to himself
  428.             If (r_data.row_id Mod 50000 = 0 Or r_data.row_id Mod 10000 = 0 Or r_data.row_id Mod 1000 = 0) And r_data.row_id <> val_arr(arrInd1) Then
  429.                 prev_row = r_data.row_prev
  430.             Else
  431.                 'MsgBox prev_row & vbCrLf & r_data.step_med
  432.                 'checking what jump we can do
  433.                 If r_data.row_id - 50000 > val_arr(arrInd1) Then
  434.                     prev_row = r_data.step_big
  435.                 ElseIf r_data.row_id - 10000 > val_arr(arrInd1) Then
  436.                     prev_row = r_data.step_med
  437.                 ElseIf r_data.row_id - 1000 > val_arr(arrInd1) Then
  438.                     prev_row = r_data.step_small
  439.                 'if we find record
  440.                 ElseIf r_data.row_id = val_arr(arrInd1) Then
  441.                     'and if record is not deleted
  442.                     If r_data.row_using = "+" Then
  443.                         record_cnt = 1
  444.                         first_start = prev_row
  445.                         last_start = prev_row
  446.                         Exit Sub
  447.                     'but if this record is deleted then record count
  448.                     '   is 0
  449.                     Else
  450.                         record_cnt = 0
  451.                         Exit Sub
  452.                     End If
  453.                 Else
  454.                     prev_row = r_data.row_prev
  455.                 End If
  456.             End If
  457.         Loop
  458. '-->
  459.     ElseIf Trim(operator_arr(arrInd1)) = "<" Then
  460.         prev_row = last_pos
  461.         last_start = 0
  462.         record_cnt = 0
  463.         Do While prev_row > 0
  464.             Get ffDB, prev_row, r_data
  465.             'if we are on step row then move to prevous because it's pointer is to himself
  466.             If (r_data.row_id Mod 50000 = 0 Or r_data.row_id Mod 10000 = 0 Or r_data.row_id Mod 1000 = 0) And r_data.row_id <> val_arr(arrInd1) Then
  467.                 prev_row = r_data.row_prev
  468.             Else
  469.                 'checking what jump we can do
  470.                 If r_data.row_id - 50000 > val_arr(arrInd1) Then
  471.                     prev_row = r_data.step_big
  472.                 ElseIf r_data.row_id - 10000 > val_arr(arrInd1) Then
  473.                     prev_row = r_data.step_med
  474.                 ElseIf r_data.row_id - 1000 > val_arr(arrInd1) Then
  475.                     prev_row = r_data.step_small
  476.                 'if we find record
  477.                 ElseIf r_data.row_id < val_arr(arrInd1) Then
  478.                     If r_data.row_using = "+" Then
  479.                         record_cnt = record_cnt + 1
  480.                         If record_cnt = 1 Then first_start = prev_row
  481.                         'Exit Sub
  482.                     End If
  483.                     prev_row = r_data.row_prev
  484.                 Else
  485.                     prev_row = r_data.row_prev
  486.                 End If
  487.             End If
  488.         Loop
  489. '-->
  490.     ElseIf Trim(operator_arr(arrInd1)) = ">" Then
  491.         prev_row = last_pos
  492.         first_start = prev_row
  493.         record_cnt = 0
  494.         Do While prev_row > 0
  495.             Get ffDB, prev_row, r_data
  496.             If r_data.row_id > val_arr(arrInd1) Then
  497.                 If r_data.row_using = "+" Then
  498.                     record_cnt = record_cnt + 1
  499.                     last_start = prev_row
  500.                 End If
  501.                 prev_row = r_data.row_prev
  502.             Else
  503.                 Exit Sub
  504.             End If
  505.         Loop
  506. '-->
  507.     ElseIf Trim(operator_arr(arrInd1)) = "<>" Then
  508.         prev_row = last_pos
  509.         last_start = 0
  510.         Do While prev_row > 0
  511.             Get ffDB, prev_row, r_data
  512.             'if we are on step row then move to prevous because it's pointer is to himself
  513.             If (r_data.row_id Mod 50000 = 0 Or r_data.row_id Mod 10000 = 0 Or r_data.row_id Mod 1000 = 0) And r_data.row_id <> val_arr(arrInd1) Then
  514.                 prev_row = r_data.row_prev
  515.             Else
  516.                 'checking what jump we can do
  517.                 If r_data.row_id - 50000 > val_arr(arrInd1) Then
  518.                     prev_row = r_data.step_big
  519.                 ElseIf r_data.row_id - 10000 > val_arr(arrInd1) Then
  520.                     prev_row = r_data.step_med
  521.                 ElseIf r_data.row_id - 1000 > val_arr(arrInd1) Then
  522.                     prev_row = r_data.step_small
  523.                 'if we find record
  524.                 ElseIf r_data.row_id = val_arr(arrInd1) Then
  525.                     If r_data.row_using = "+" Then
  526.                         record_cnt = tbl_recs - 1
  527.                         skip_row = prev_row
  528.                         first_start = last_pos
  529.                         Exit Sub
  530.                     End If
  531.                 Else
  532.                     prev_row = r_data.row_prev
  533.                 End If
  534.             End If
  535.         Loop
  536.     End If
  537. End Sub
  538. '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  539. '               load data from file
  540. '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  541. Friend Sub set_arr(ByVal data_index As Long, Optional arrInd1 As Integer = 0)
  542.     'find and read selected row
  543.      'if search is not by indexed row
  544.      
  545. '-->
  546.     'if we have positions of selected columns in array
  547.     If readFrom_arr = True Then
  548.         If record_cnt > 0 Then
  549.             If data_index <= UBound(use_arr) Then
  550.                 Get ffDB, use_arr(data_index), r_data
  551.                 'curr_row = data_index + 1
  552.                 tmp_rowData = r_data.row_contain
  553.             End If
  554.         End If
  555. '-->
  556.     'if searching by primary key
  557.     ElseIf prev_ind = -1 Then
  558.         Do While curr_row <= data_index
  559.             'tmp_row = prev_row
  560.             If prev_row = 0 Then Exit Do
  561.             Get ffDB, prev_row, r_data
  562.             'if not deleted then save it
  563.             If r_data.row_using = "+" And skip_row <> prev_row Then
  564.                 If isInArrLng(dontUse_arr, prev_row) <> True Then
  565.                     'save row fields
  566.                     If curr_row = data_index Then
  567.                         tmp_rowData = r_data.row_contain
  568.                         currRec_pos = prev_row
  569.                         prev_row = r_data.row_prev
  570.                         '
  571.                         Exit Do
  572.                     End If
  573.                     curr_row = curr_row + 1
  574.                     If curr_row > record_cnt Or curr_row <= last_start Then Exit Sub
  575.                 End If
  576.             End If
  577.             prev_row = r_data.row_prev
  578.         Loop
  579. '-->
  580.     Else
  581.         If prev_ind = 0 Then Exit Sub
  582.         Do While prev_ind > 0
  583.             'read index
  584.             Get ffDB, prev_ind, ind_data
  585.             'If ind_data.fld_data = val_arr(arrInd1) Then
  586.                 'find row pointer
  587.                 prev_row = ind_data.fld_row
  588.                 'check does current index data match query
  589.                 If ind_data.fld_data = val_arr(arrInd1) Then
  590.                     'if this row is not in dont use arr
  591.                     If isInArrLng(dontUse_arr, prev_row) <> True Then
  592.                         Get ffDB, prev_row, r_data
  593.                         'check is row deleted
  594.                         If r_data.row_using = "+" Then
  595.                             tmp_rowData = r_data.row_contain
  596.                             prev_ind = ind_data.prev_index
  597.                             currRec_pos = prev_row
  598.                             'curr_row = curr_row + 1
  599.                             GoTo exitCheck
  600.                         End If
  601.                     End If
  602.                 End If
  603.             'End If
  604.             prev_ind = ind_data.prev_index
  605.         Loop
  606.     End If
  607.     'if searching by primary key
  608.     
  609.     'End If
  610. exitCheck:
  611.     'if we using recordet for deleting then we only need record position
  612.     '   we don't need to parse columns values
  613.     If is_delete <> True Then
  614.         j = 0
  615.         k = 1
  616.         c = 0
  617.         i1 = 0
  618.         Do While k > 0
  619.             'each value is in ' ', so we searching for '
  620.             k = InStr(k, tmp_rowData, "'")
  621.             If k > 0 Then
  622.                 c = c + 1
  623.                 If c = 2 Then
  624.                     For i = 0 To UBound(msel_cols)
  625.                         'when we find start and end of data, read data and save
  626.                         If msel_cols(i) = j Then
  627.                             fileds_arr(i1) = Mid(tmp_rowData, lastS, k - lastS)
  628.                             i1 = i1 + 1
  629.                         End If
  630.                     Next i
  631.                     'MsgBox fileds_arr(j)
  632.                     c = 0
  633.                     j = j + 1
  634.                 Else
  635.                     lastS = k + 1
  636.                 End If
  637.                 k = k + 1
  638.             End If
  639.         Loop
  640.     End If
  641.  
  642. End Sub
  643. '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  644. '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  645.                 
  646.                 
  647.  
  648.  
  649.  
  650. '##############################################################
  651. '                  public properties
  652. '##############################################################
  653. 'get row count
  654. Public Property Get Rows() As Long
  655.     Rows = record_cnt
  656. End Property
  657. 'get column count
  658. Public Property Get Columns() As Long
  659.     Columns = column_cnt
  660. End Property
  661. 'get current row
  662. Public Property Get CurrentRow() As Long
  663.     CurrentRow = curr_row
  664. End Property
  665. 'get data of selected field
  666. Public Property Get Fields(ByVal fld_index As Long) As String
  667.     '/////////////////////////////////////////////
  668.     Fields = fileds_arr(fld_index)
  669. End Property
  670. 'get current row
  671. Public Property Get IsEOF() As Boolean
  672.     If curr_row >= record_cnt - 1 Then
  673.         IsEOF = True
  674.     Else
  675.         IsEOF = False
  676.     End If
  677. End Property
  678.  
  679. '##############################################################
  680. '                  public functions
  681. '##############################################################
  682. 'go to first row
  683. Public Function MoveFirst()
  684.     prev_row = first_start
  685.     curr_row = 0
  686.     set_arr 0
  687. End Function
  688. 'go to last row
  689. Public Function MoveLast()
  690.     set_arr record_cnt - 1
  691. End Function
  692. 'go to next row
  693. Public Function MoveNext()
  694.     curr_row = curr_row + 1
  695.     If curr_row > record_cnt Then
  696.         MoveLast
  697.         Err.Raise 380, "clsRecordset"
  698.     End If
  699.     set_arr curr_row
  700. End Function
  701. 'go to prev row
  702. Public Function MovePrevious()
  703.     Dim tmp_curr As Long
  704.     If curr_row = 0 Then
  705.         Err.Raise 380, "clsRecordset"
  706.     End If
  707.     
  708.     prev_ind = first_ind
  709.     prev_row = first_start
  710.     tmp_curr = curr_row - 1
  711.     curr_row = 0
  712.     
  713.     set_arr tmp_curr
  714. End Function
  715. 'move to row
  716. Public Function MoveToRow(ByVal row_index As Long)
  717.     
  718.     If row_index < 0 Or row_index > record_cnt Then
  719.         Err.Raise 380, "clsRecordset"
  720.     Else
  721.         If row_index > curr_row Then
  722.             'curr_row = row_index
  723.             set_arr row_index
  724.         ElseIf row_index < curr_row Then
  725.             prev_ind = first_ind
  726.             prev_row = first_start
  727.             curr_row = 0
  728.             
  729.             set_arr row_index
  730.         End If
  731.     End If
  732. End Function
  733.  
  734. Private Sub Class_Terminate()
  735.     'free memory
  736.     Erase colIndex_arr
  737.     Erase val_arr
  738.     Erase operator_arr
  739.     Erase condOper_arr
  740.     
  741.     Erase fileds_arr
  742.     Erase ind_cols
  743.     Erase chrInd_pos
  744.     Erase dontUse_arr
  745.     Erase use_arr
  746. End Sub
  747.  
  748.